{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Deep AutoEncoder for Collaborative Filtering\n",
    "\n",
    "这里用到的[模型](https://arxiv.org/abs/1708.01715)由NVIDIA的小伙伴提出来，是一个6层的深度autoencoder，这里用的激活函数是SELU (scaled exponential linear units)，同时为了提高泛化能力添加了dropout。\n",
    "\n",
    "一个autoencoder其实就是一个完成了下面2种变换的神经网络: $encode(x): R^n \\Rightarrow R^d$ 和 $decoder(z): R^d \\Rightarrow R^n$。autoencoder的最终目标是获得原始数据的一个$d$维表示，同时希望这时候的autoencoder能最小化$x$ 和 $f(x) = decode(encode(x))$之间的差异。下图显示了[论文](https://arxiv.org/abs/1708.01715)里提出的autoencoder结构。Encoder部分有2层$e_1$ 和 $e_2$，decoder 也有2层$d_1$ 和 $d_2$。可以在编码层$z$使用dropout，其实在论文中，实验了不同的层数，从2到12\n",
    "\n",
    "![](http://nbviewer.jupyter.org/github/miguelgfierro/sciblog_support/blob/master/Intro_to_Recommendation_Systems/data/AutoEncoder.png)\n",
    "\n",
    "在forward pass(前向运算)阶段模型通过他在训练集中的打分$x \\in R^n$获得用户的表示(向量)，其中$n$是items的个数。需要特别注意的是$x$是非常稀疏的，但是在输出侧$y=f(x) \\in R^n$是一个稠密向量，包含了对所有item的打分，这里用到的损失函数是均方误差(RMSE).\n",
    "\n",
    "核心的思想是希望能通过反向传播训练网络最小化输入和输出的误差，从而完成对未知的电影进行预估。在paper里尝试了不同的[激活函数](https://github.com/pytorch/pytorch/blob/master/torch/nn/functional.py)，发现在这个任务上ELU, SELU 和 LRELU(注意到这些激活函数在负的那一侧都不是0)，比SIGMOID, RELU, RELU6, 和 TANH效果要好。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 代码实现"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### [基于 PyTorch 的 Deep Auto Encoder 推荐系统](PyTorch/DAE_pytorch.ipynb)\n",
    "\n",
    "### [基于TensorFlow 的 Deep Auto Encoder 推荐系统](TensorFlow/DAE_tensorflow.ipynb)"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.4"
  },
  "toc": {
   "base_numbering": 1,
   "nav_menu": {},
   "number_sections": false,
   "sideBar": true,
   "skip_h1_title": false,
   "title_cell": "Table of Contents",
   "title_sidebar": "Contents",
   "toc_cell": false,
   "toc_position": {},
   "toc_section_display": true,
   "toc_window_display": false
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
